package ar.edu.utn.frba.tacs.warnes.aop;

import ar.edu.utn.frba.tacs.warnes.Auto;
import ar.edu.utn.frba.tacs.warnes.Reserva;
import ar.edu.utn.frba.tacs.warnes.Venta;
import ar.edu.utn.frba.tacs.warnes.excepciones.DominioWarnesException;
import ar.edu.utn.frba.tacs.warnes.pedido.Pedido;
import ar.edu.utn.frba.tacs.warnes.pieza.Pieza;
import ar.edu.utn.frba.tacs.warnes.utils.ConstantesWarnes;
import ar.edu.utn.frba.tacs.warnes.utils.ContenedorWarnes;

public aspect Logger {

	
	
	pointcut loguearNuevaPieza(Pieza pieza) : execution(Pieza.new(..)) && this(pieza);
    after(Pieza pieza) returning : loguearNuevaPieza(pieza) { 
        Utils.loguear("Se ha CREADO una nueva PIEZA llamada " + pieza.getDescripcion()); 
    }

	pointcut loguearNuevoAuto(Auto auto) : execution(Auto.new(..)) && this(auto);
    after(Auto auto) returning : loguearNuevoAuto(auto) { 
        Utils.loguear("Se ha CREADO un nuevo AUTO con patente " + auto.getPatente()); 
    }

	pointcut loguearNuevaReserva(Reserva reserva) : execution(Reserva.new(..)) && this(reserva);
    after(Reserva reserva) returning : loguearNuevaReserva(reserva) { 
        Utils.loguear("Se ha CREADO una nueva RESERVA de piezas con "+reserva.getPiezasReservadas().size()+ " items"); 
    }
    
	pointcut loguearPiezaReservada(Pieza pieza) : execution(* Reserva.reservarPieza(..)) && args(pieza);
    after(Pieza pieza) returning : loguearPiezaReservada(pieza) { 
        Utils.loguear("La PIEZA "+pieza.getDescripcion()+" fue reservada con exito"); 
    }

	pointcut loguearNuevaVenta(Venta venta) : execution(Venta.new(..)) && this(venta);
    after(Venta venta) returning : loguearNuevaVenta(venta) { 
        Utils.loguear("Se ha CREADO una nueva VENTA de piezas con "+venta.getPiezasVendidas().size()+ " items"); 
    }
    
    pointcut loguearPiezaVendida(Pieza pieza) : execution(void Venta.venderPieza(..)) && args(pieza);
    after(Pieza pieza) returning : loguearPiezaVendida(pieza) { 
    	Utils.loguear("La PIEZA "+pieza.getDescripcion()+" fue vendida con exito"); 
    }
    
    pointcut loguearException(DominioWarnesException exc) : execution(DominioWarnesException.new(..)) && this(exc);
    after(DominioWarnesException exc) returning : loguearException(exc) { 
    	if(ConstantesWarnes.LogLevel.DEBUG.equals(ContenedorWarnes.getInstance().getLogLevel()))
    		Utils.loguear(ConstantesWarnes.LogLevel.DEBUG, "<< ERROR >> "+exc.getMessage()); 
    }
    
    pointcut loguearNuevoPedido(Pedido ped) : execution(Pedido.new(..)) && this(ped);
    after(Pedido ped) returning : loguearNuevoPedido(ped) { 
    	Utils.loguear("Se ha CREADO un nuevo PEDIDO con "+ped.getPiezas().size()+" piezas.");
    	Utils.logEnArchivo("Se ha CREADO un nuevo PEDIDO con "+ped.getPiezas().size()+" piezas.", ped.getId()); 
    }    
    
    pointcut loguearCancelacionPedido() : execution(* Pedido.cancelar(..)) ;
    before() : loguearCancelacionPedido() { 
    	Utils.loguear("Se ha CANCELADO un PEDIDO que tenia "+((Pedido)thisJoinPoint.getTarget()).getPiezas().size()+" piezas."); 
    	Utils.logEnArchivo("Se ha CANCELADO un PEDIDO que tenia "+((Pedido)thisJoinPoint.getTarget()).getPiezas().size()+" piezas.", ((Pedido)thisJoinPoint.getTarget()).getId());
    }
    
    pointcut loguearEfectivizacionPedido() : execution(* Pedido.efectivizar());
    after() returning : loguearEfectivizacionPedido() { 
       	Utils.loguear("Se ha EFECTIVIZADO un PEDIDO que tenia "+((Pedido)thisJoinPoint.getTarget()).getPiezas().size()+" piezas."); 
       	Utils.logEnArchivo("Se ha EFECTIVIZADO un PEDIDO que tenia "+((Pedido)thisJoinPoint.getTarget()).getPiezas().size()+" piezas.", ((Pedido)thisJoinPoint.getTarget()).getId());
   }
    
    pointcut loguearAgregarPiezaAPedido(Pieza pieza) : execution(* Pedido.agregarPieza(..)) && args(pieza);
    after(Pieza pieza) returning : loguearAgregarPiezaAPedido(pieza) {
    	Utils.loguear("La PIEZA "+pieza.getDescripcion()+" se agrego al PEDIDO."); 
    }  
}
